/**
 * 类名：StringUtil
 * @author hmb
 * 创建日期： 2014-9-30 下午11:32:05
 *
 * 备注：一些与字符串处理有关的工具类，不断更新中
 * 			待加入：md5加密，base64编码
 * 
 */
package com.erms.util;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import java.util.regex.Pattern;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.log4j.Logger;

/**
 * @author hmb
 * 
 */
public class StringUtil {
	private static Logger	logger	= LogUtil.getLogger(StringUtil.class);

	/**
	 * 判断当前字符串是否为null或空
	 * 
	 * @param s 待验证的字符串
	 * @return
	 */
	public static boolean isNull(String s) {

		return s == null || "".equals(s.trim());
	}

	/**
	 * 把将出现在url地址的字符串进行url特殊编码处理，一般用于将作为get参数的字符串，处理后可避免url歧义
	 * 
	 * @param url 要编码的字符串
	 * @return 编码过字符串，特殊html符号将被转义
	 * @see StringUtil#urlDecode(String)
	 */
	public static String urlEncode(String url) {

		try {
			return URLEncoder.encode(url.trim(), "utf-8");
		} catch (UnsupportedEncodingException e) {
			logger.debug("urlEncode", e);
		}
		// 事实上，下面这句不会执行，上面的语句是不会抛出异常滴
		return url;
	}

	/**
	 * 把url中的被url化编码的get参数解码，得到正常语义的字符串
	 * 
	 * @param url 要解码的字符串
	 * @return 解码过的字符串
	 * @see StringUtil#urlEncode(String)
	 */
	public static String urlDecode(String url) {

		try {
			return URLDecoder.decode(url, "utf-8");
		} catch (UnsupportedEncodingException e) {
			logger.debug("urlDecode", e);
		}
		// 事实上，下面这句不会执行，上面的语句是不会抛出异常滴
		return url;
	}

	/**
	 * md5加密，不可逆，结果为32位小写的密文，如果需要16位密文则取结果的8至24位,或调用md5ForShort
	 * 
	 * @param text 原文
	 * @return 密文
	 * @see StringUtil#md5ForShort(String)
	 */
	public static String md5(String text) {

		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(text.getBytes());
			byte b[] = md.digest();

			int i;

			StringBuffer buf = new StringBuffer("");
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0) {
					i += 256;
				}
				if (i < 16) {
					buf.append("0");
				}
				buf.append(Integer.toHexString(i));
			}

			return buf.toString();
		} catch (NoSuchAlgorithmException e) {
			logger.debug("md5", e);
		}
		return null;
	}

	/**
	 * md5加密，不可逆，结果为16位小写的密文
	 * 
	 * @param text 原文
	 * @return 密文
	 */
	public static String md5ForShort(String text) {

		String result = md5(text);
		if (result == null) { return null; }
		return result.substring(8, 24);

	}

	/**
	 * Base64加密，简单加密,可逆
	 * 
	 * @param text 原文
	 * @return 密文
	 * @see StringUtil#fromBase64(String)
	 */
	public static String toBase64(String text) {

		if (StringUtil.isNull(text)) { return null; }
		try {
			return new String(Base64.encodeBase64(text.getBytes()), "UTF-8");
		} catch (UnsupportedEncodingException e) {
			logger.debug("toBase64", e);
		}
		return null;
	}

	/**
	 * Base64解密
	 * 
	 * @param text 密文
	 * @return 原文
	 * @see StringUtil#toBase64(String)
	 */
	public static String fromBase64(String text) {

		if (StringUtil.isNull(text)) { return null; }
		try {
			return new String(Base64.decodeBase64(text), "UTF-8");
		} catch (UnsupportedEncodingException e) {
			logger.debug("fronBase64", e);
		}
		return null;
	}
	
	/**
	 * 长度为16的随机字符串
	 * @return
	 */
	public static String random() {

		return random(16);
	}

	public static String random(int n) {

		StringBuffer buffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz" +
				"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
				"1234567890");
		int length = buffer.length();
		Random random = new Random();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < n; i++) {
			sb.append(buffer.charAt(random.nextInt(length)));
		}
		return sb.toString();
		//return RandomStringUtils.random(n);
	}

	public static boolean isInteger(String str) {
		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
		return pattern.matcher(str).matches();
	}

	public static void main(String[] args) {

	}
}
